#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

//namespace bit
//{
//	class string
//	{
//	public:
//		string(string& s)
//		{
//			string tmp(s._str);
//			swap(_str, tmp._str);
//			swap(_str, tmp._str);
//			swap(_str, tmp._str);
//		}
//		~string()
//		{
//			delete[]_str;
//			_str = nullptr;
//			_size = _capacity = 0;
//		}
//	private:
//		char* _str=nullptr;
//		size_t _size=0;
//		size_t _capacity=0;
//	};
//}
//void test()
//{
//	string s1("qwertyuio");
//
//	string::iterator it = s1.begin();
//	while (it!=s1.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//}
//
//
//void test2()
//{
//	string s2("asdfghjkl");
//	for (auto ch : s2)
//	{
//		cout << ch << " ";
//	}
//	cout << endl;
//}
//int main()
//{
//	test2();
//	return 0;
//}

//namespace bit
//{
//	class string
//	{
//	public:
//		string(const char* str = "")
//		{
//			_size = strlen(str);
//			_size = _capacity;
//			_str = new char[_capacity + 1];
//			strcpy(_str, str);
//		}
//
//		//s1(s2)
//		void swap(string& s)
//		{
//			std::swap(_str, s._str);
//			std::swap(_size, s._size);
//			std::swap(_capacity, s._capacity);
//		}
//		string(const string& s)
//		{
//			string tmp(s._str);
//			swap(tmp);
//		}
//		~string()
//		{
//			delete[]_str;
//			_str = nullptr;
//			_size = _capacity = 0;
//		}
//	private:
//		char* _str = nullptr;
//		size_t _size = 0;
//		size_t _capacity = 0;
//	};
//}
//
//int main()
//{
//	return 0;
//}

namespace bit
{
	class string
	{
	public:
		string(const char* str="")
		{
			_size = strlen(str);
			_capacity = _size;
			_str = new char[_capacity + 1];
			strcpy(_str, str);
		}
		~string()
		{
			delete[]_str;
			_str = nullptr;
			_size = _capacity;
		}
		/*string(const string& s)
		{
			_str = new char[s._capacity+1];
			strcpy(_str, s._str);
			_size = s._size;
			_capacity = s._capacity;
		}*/

		void swap(string& s)
		{
			std::swap(_str, s._str);
			std::swap(_size, s._size);
			std::swap(_capacity, s._capacity);
		}
		string(const string& s)
		{
			string tmp(s._str);
			swap(tmp);
		}
		string& operator=(const string& s)
		{
			if (this != &s)
			{
				string tmp(s._str);
				swap(tmp);
			}

			return *this;
		}
	private:
		char* _str = nullptr;
		size_t _size = 0;
		size_t _capacity = 0;
	};
}